package com.hq.ims.home.service.file;


import com.hq.ims.data.utils.LocalConstant;
import com.hq.ims.data.vo.AppFileMapstruct;
import com.hq.utils.exception.CommonException;
import com.hq.utils.util.FileUtils;
import com.hq.web.conf.bean.UserAttribute;
import com.hq.web.utils.ApplicationContextHelper;
import com.hq.web.utils.HttpUtils;
import com.hq.web.utils.WebUtils;
import org.springframework.web.multipart.MultipartFile;

import javax.servlet.http.HttpServletResponse;
import java.io.File;
import java.io.InputStream;
import java.util.ArrayList;
import java.util.List;

/**
 * 文件VO类
 * <p>
 * jbp
 */
public interface IFileService {
    /**
     * 下载地址
     */
    String DOWN_URL_FORMAT_STR = "/global/base/app/download?fileIdList=%s";
    /**
     * 预览地址
     */
    String PREVIEW_URL_FORM_STR = "/global/base/app/preview?fileId=%s";

    /**
     * app上传文件
     *
     * @param file 文件对象
     */
    AppFileMapstruct.FileVo appUploadFile(MultipartFile file);

    /**
     * 多文件上传
     *
     * @param fileList 多文件对象
     */
    default List<AppFileMapstruct.FileVo> appUploadFileList(MultipartFile[] fileList) {
        List<AppFileMapstruct.FileVo> fileVoList = new ArrayList<>(fileList.length);
        for (MultipartFile multipartFile : fileList) {
            AppFileMapstruct.FileVo fileVo = this.appUploadFile(multipartFile);
            fileVoList.add(fileVo);
        }
        return fileVoList;
    }

    /**
     * app文件下载
     *
     * @param fileIdList 文件id列表
     */
    void appFileDown(List<String> fileIdList);

    /**
     * app多文件下载
     *
     * @param fileIdList 文件id列表
     */
    void appMultiFileDown(List<String> fileIdList);

    /**
     * 用户文件下载
     *
     * @param fileIdList 文件id列表
     */
    void userFileDown(List<String> fileIdList);

    /**
     * 用户多文件下载
     *
     * @param fileIdList 文件id列表
     */
    void userMultiFileDown(List<String> fileIdList);

    /**
     * app文件预览
     *
     * @param fileId 文件id
     */
    void appFilePreview(String fileId);

    /**
     * 用户文件预览
     *
     * @param fileId 文件id
     */
    void userFilePreview(String fileId);

    /**
     * 预览
     *
     * @param is 文件ID
     */
    default void preview(
            InputStream is,
            String fileName,
            String fileSuffix,
            Long fileSize
    ) {
        try {
            //是否是预览文件
            boolean isCanPreFile = LocalConstant.PREVIEW_SUFFIX_LIST.contains(fileSuffix.toLowerCase());
            HttpServletResponse response = WebUtils.getResponse();
            if (!isCanPreFile) {
                throw CommonException.build("该文件不支持预览");
            }
            HttpUtils.setDownloadHeaderByFileType(response, fileName, true, fileSize);
            FileUtils.downFile(is, response.getOutputStream());
        } catch (Exception e) {
            e.printStackTrace();
            return;
        }
    }

    /**
     * 获取新的文件名
     *
     * @param fileName 文件名称
     */
    default File getRandomFileName(String saveDir, String fileName) {
        UserAttribute userAttribute = ApplicationContextHelper.getUserAttributeBean();
        File file = new File(saveDir + "/" + System.currentTimeMillis() + fileName);
        return !FileUtils.createFileDir(file) ? null : file;
    }


}
